package cn.tedu.csmall.product.webapi.mapper;


import cn.tedu.csmall.pojo.entity.Category;
import cn.tedu.csmall.pojo.vo.CategorySimpleListItemVO;
import cn.tedu.csmall.pojo.vo.CategorySimpleVO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

/**
 * 处理“类别”数据的持久层接口
 */
@Repository
public interface CategoryMapper {

    /**
     * 插入“类别”数据
     *
     * @param category 类别
     * @return 受影响的行数
     */
    int insert(Category category);

    /**
     * 根据“类别”id修改“是否为父级类别”
     *
     * @param id       “类别”id
     * @param isParent 是否为父级类别，1=是，0=否
     * @return 受影响的行数
     */
    int updateIsParentById(@Param("id") Long id, @Param("isParent") Integer isParent);

    /**
     * 根据“类别”id查询“类别”的简单信息
     *
     * @param id “类别”id
     * @return “类别”的简单信息
     */
    CategorySimpleVO getById(Long id);

    /**
     * 根据“类别”名称查询“类别”的简单信息
     *
     * @param name “类别”名称
     * @return “类别”的简单信息
     */
    CategorySimpleVO getByName(String name);


    //    1. 根据类别的id，禁用对应的类别
//- 类别不存在时抛出异常
//- 类别已禁用时抛出异常
    //根据id查找类别
    Integer selectEnableById(Integer id);
    //根据id禁用类别
    Integer upEnableById(Integer id);

    //2. 根据类别的id，启用对应的类别
//- 类别不存在时抛出异常
//- 类别已启用时抛出异常
    //根据id启用类别
    Integer upEnableByIdQ(Integer id);
    //3. 根据类别的id，隐藏（调整is_display的值）对应的类别（调整is_display的值）
//            - 类别不存在时抛出异常
//- 类别已隐藏时抛出异常
    //根据id查找类别的display
    Integer selectDisplayById(Integer id);
    //根据id隐藏类别
    Integer upDisplayById(Integer id);
    //4. 根据类别的id，显示（调整is_display的值）对应的类别
//- 类别不存在时抛出异常
//- 类别已显示时抛出异常
    //根据id显示类别
    Integer upDisplayByIdQ(Integer id);
    //5. 根据类别的id，删除对应的类别
//- 类别不存在时抛出异常
//- 类别存在子级类别时抛出异常
//- 如果删除的类别是父级类别中的最后一个类别，删除成功后，父级类别的is_parent需更新为0）
//    <!--    根据id查找分类-->
    CategorySimpleVO selectCategoryById(Integer id);
//    根据自身id查找子类数量
    Integer selectSonNumberById(Integer id);
//    根据id删除分类
    void deleteById(Integer id);
//    根据id将分类设置为无子分类
    void upIsParentToZeroById(Integer ParentId);
    //  6. 根据类别的id，修改对应的类别的基本信息，包括：名称、关键字、图标、排序序号
//- 类别不存在时抛出异常
//- 新名称已经被占用时抛出异常
    //    根据id查找分类
    CategorySimpleListItemVO selectById(Integer id);
    //根据id排除自身后再查询传入名称是否有重复
    Integer selectRepeatName(@Param("id") Integer id,@Param("name")String name);
    //根据实体类修改对应id分类的信息
    void upCategory(CategorySimpleListItemVO categorySimpleListItemVO);
    //7. 重建缓存
//    当请求 /categories/cache/rebuild 路径时，将重建Redis缓存中的所有类别数据（与缓存预热相同的处理）
    void onRedis();
}
